#include </home/david/Escritorio/Embebidos/OpenCV-2.4.2/modules/objdetect/include/opencv2/objdetect/objdetect.hpp>
#include </home/david/Escritorio/Embebidos/OpenCV-2.4.2/modules/highgui/include/opencv2/highgui/highgui.hpp>
#include </home/david/Escritorio/Embebidos/OpenCV-2.4.2/modules/imgproc/include/opencv2/imgproc/imgproc.hpp>
//#include <iostream>
#include <stdio.h>
#include <string.h>
#include "cv.h"
IplImage* imgTracking;
int lastX = -1;
int lastY = -1;

IplImage* GetThresholdedImage(IplImage* imgHSV){       								// conversion binaria a imagen
       IplImage* imgThresh=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1);					// de tipo HSV, ademas se
       cvInRangeS(imgHSV, cvScalar(75,90,80,0), cvScalar(130,255,170,0), imgThresh);//verde min 50 max 70	// establece los rangos de los 
       return imgThresh;											// colores a detectar
}

void trackObject(IplImage* imgThresh){
	CvMoments *moments=(CvMoments*)malloc(sizeof(CvMoments));		// calcula todos los momentos y 
	cvMoments(imgThresh, moments, 1);					// el centro del objeto a reconocer
	double moment10 = cvGetSpatialMoment(moments,1,0);			// tambien el area 
	double moment01 = cvGetSpatialMoment(moments,0,1);			//
	double area = cvGetCentralMoment(moments,0,0);				//
	
	if(area>1000){
		int posX = moment10/area;					//calcula la posicion en X y Y
		int posY = moment01/area;					//
	
		if(lastX>=0 && lastY>=0 && posX>=0 && posY>=0){
		cvLine(imgTracking, cvPoint(posX, posY), cvPoint(lastX, lastY), cvScalar(255,255,0,0),1 , 4, 0);// se le da color y 
		}												// ademas va dibujando 
		lastX = posX;											// la posicion anterior y 
		lastY = posY;											// la actual
	}
	free(moments);	
}

int main(){
	CvCapture* camera = cvCreateCameraCapture(-1); 			// Uso de la camara por default
	//cvNamedWindow("Video", CV_WINDOW_AUTOSIZE);			
	cvNamedWindow("Reconocimiento", CV_WINDOW_AUTOSIZE);		// creacion de la ventana donde se podra
	cvNamedWindow("Video", CV_WINDOW_AUTOSIZE);			// visualizar ambas capturas


	IplImage* frame;  
	frame = cvQueryFrame(camera);                   
	if (!camera){
		printf("Fallo captura\n");
		return -1;
	}
	imgTracking=cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);  
	cvZero(imgTracking);
	while(1){
		frame = cvQueryFrame(camera);
		//if(!frame) break;
		
		frame=cvCloneImage(frame);
		cvSmooth(frame,frame, CV_GAUSSIAN, 3, 3, 0, 0);
		IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);
		cvCvtColor(frame, imgHSV, CV_BGR2HSV);
		IplImage* imgThresh = GetThresholdedImage(imgHSV);
		cvSmooth(imgThresh, imgThresh, CV_GAUSSIAN,3,3,0,0);
		
		trackObject(imgThresh);
		cvAdd(frame, imgTracking,frame,NULL);		


		cvShowImage("Video", frame);
		cvShowImage("Reconocimiento", imgThresh);

		//cvReleaseCapture(&imgThresh);
		//cvReleaseCapture(&imgHSV);
		//cvReleaseCapture(&frame);
		//cvReleaseCapture(&camera);
		char c = cvWaitKey(10);//33
		if(c==27) break;//30
	}
	//cvReleaseCapture(&camera);
	cvDestroyAllWindows();
	cvReleaseCapture(&camera);
	return 0;

}

